์ฝ๋ ์์ฑ์ ์ค๊ฐ ํํ(IR) ์ธ๊ณ๋ฅผ ํํํ์ธ์. IR์ ์ข ๋ฅ, ์ฅ์ , ๊ทธ๋ฆฌ๊ณ ๋ค์ํ ์ํคํ ์ฒ์ ๋ง์ถฐ ์ฝ๋๋ฅผ ์ต์ ํํ๋ ๋ฐ ์์ด ๊ทธ ์ค์์ฑ์ ๋ํด ์์๋ณด์ธ์.
์ฝ๋ ์์ฑ: ์ค๊ฐ ํํ(IR) ์ฌ์ธต ํ๊ตฌ
์ปดํจํฐ ๊ณผํ ๋ถ์ผ์์ ์ฝ๋ ์์ฑ์ ์ปดํ์ผ ๊ณผ์ ์ ํต์ฌ์ ์ธ ๋จ๊ณ์ ๋๋ค. ์ด๋ ๊ณ ๊ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ๊ธฐ๊ณ๊ฐ ์ดํดํ๊ณ ์คํํ ์ ์๋ ์ ์์ค ํํ๋ก ๋ณํํ๋ ๊ธฐ์ ์ ๋๋ค. ํ์ง๋ง ์ด ๋ณํ์ด ํญ์ ์ง์ ์ ์ผ๋ก ์ด๋ฃจ์ด์ง์ง๋ ์์ต๋๋ค. ์ข ์ข ์ปดํ์ผ๋ฌ๋ ์ค๊ฐ ํํ(Intermediate Representation, IR)์ด๋ผ๋ ์ค๊ฐ ๋จ๊ณ๋ฅผ ์ฌ์ฉํฉ๋๋ค.
์ค๊ฐ ํํ์ด๋ ๋ฌด์์ธ๊ฐ?
์ค๊ฐ ํํ(IR)์ ์ปดํ์ผ๋ฌ๊ฐ ์ต์ ํ์ ์ฝ๋ ์์ฑ์ ์ ํฉํ ๋ฐฉ์์ผ๋ก ์์ค ์ฝ๋๋ฅผ ํํํ๊ธฐ ์ํด ์ฌ์ฉํ๋ ์ธ์ด์ ๋๋ค. ์ด๋ ์์ค ์ธ์ด(์: Python, Java, C++)์ ๋์ ๊ธฐ๊ณ ์ฝ๋ ๋๋ ์ด์ ๋ธ๋ฆฌ ์ธ์ด ์ฌ์ด์ ๋ค๋ฆฌ๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค. IR์ ์์ค ํ๊ฒฝ๊ณผ ๋์ ํ๊ฒฝ ๋ชจ๋์ ๋ณต์ก์ฑ์ ๋จ์ํํ๋ ์ถ์ํ์ ๋๋ค.
์๋ฅผ ๋ค์ด, Python ์ฝ๋๋ฅผ x86 ์ด์ ๋ธ๋ฆฌ๋ก ์ง์ ๋ณํํ๋ ๋์ , ์ปดํ์ผ๋ฌ๋ ๋จผ์ ์ด๋ฅผ IR๋ก ๋ณํํ ์ ์์ต๋๋ค. ์ด IR์ ์ต์ ํ๋ ํ ๋์ ์ํคํ ์ฒ์ ์ฝ๋๋ก ๋ณํ๋ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ๊ฐ์ ์ ํ๋ก ํธ์๋(์ธ์ด๋ณ ํ์ฑ ๋ฐ ์๋ฏธ ๋ถ์)์ ๋ฐฑ์๋(๊ธฐ๊ณ๋ณ ์ฝ๋ ์์ฑ ๋ฐ ์ต์ ํ)๋ฅผ ๋ถ๋ฆฌํ๋ ๋ฐ ์์ต๋๋ค.
์ค๊ฐ ํํ์ ์ฌ์ฉํ๋ ์ด์
IR์ ์ฌ์ฉํ๋ฉด ์ปดํ์ผ๋ฌ ์ค๊ณ ๋ฐ ๊ตฌํ์์ ๋ค์๊ณผ ๊ฐ์ ๋ช ๊ฐ์ง ์ฃผ์ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค:
- ์ด์์ฑ: IR์ ์ฌ์ฉํ๋ฉด ํ ์ธ์ด์ ๋ํ ๋จ์ผ ํ๋ก ํธ์๋๋ฅผ ์ฌ๋ฌ ๋์ ์ํคํ ์ฒ๋ฅผ ์ํ ๋ค์์ ๋ฐฑ์๋์ ์ฐ๊ฒฐํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, Java ์ปดํ์ผ๋ฌ๋ JVM ๋ฐ์ดํธ์ฝ๋๋ฅผ IR๋ก ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด Java ํ๋ก๊ทธ๋จ์ ์ฌ์ปดํ์ผ ์์ด JVM์ด ๊ตฌํ๋ ๋ชจ๋ ํ๋ซํผ(Windows, macOS, Linux ๋ฑ)์์ ์คํ๋ ์ ์์ต๋๋ค.
- ์ต์ ํ: IR์ ์ข ์ข ํ๋ก๊ทธ๋จ์ ๋ํ ํ์คํ๋๊ณ ๋จ์ํ๋ ๋ทฐ๋ฅผ ์ ๊ณตํ์ฌ ๋ค์ํ ์ฝ๋ ์ต์ ํ๋ฅผ ์ํํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ์ผ๋ฐ์ ์ธ ์ต์ ํ์๋ ์์ ํด๋ฉ, ์ฃฝ์ ์ฝ๋ ์ ๊ฑฐ, ๋ฃจํ ํผ์น๊ธฐ ๋ฑ์ด ํฌํจ๋ฉ๋๋ค. IR์ ์ต์ ํํ๋ฉด ๋ชจ๋ ๋์ ์ํคํ ์ฒ์ ๋์ผํ ์ด์ ์ ์ ๊ณตํฉ๋๋ค.
- ๋ชจ๋์ฑ: ์ปดํ์ผ๋ฌ๊ฐ ๋ช ํํ ๋จ๊ณ๋ก ๋๋์ด ์ ์ง๋ณด์ ๋ฐ ๊ฐ์ ์ด ์ฉ์ดํด์ง๋๋ค. ํ๋ก ํธ์๋๋ ์์ค ์ธ์ด๋ฅผ ์ดํดํ๋ ๋ฐ, IR ๋จ๊ณ๋ ์ต์ ํ์, ๋ฐฑ์๋๋ ๊ธฐ๊ณ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ ์ง์คํฉ๋๋ค. ์ด๋ฌํ ๊ด์ฌ์ฌ์ ๋ถ๋ฆฌ๋ ์ฝ๋ ์ ์ง๋ณด์์ฑ์ ํฌ๊ฒ ํฅ์์ํค๊ณ ๊ฐ๋ฐ์๊ฐ ํน์ ์์ญ์ ์ ๋ฌธ์ฑ์ ์ง์คํ ์ ์๊ฒ ํฉ๋๋ค.
- ์ธ์ด์ ๋ ๋ฆฝ์ ์ธ ์ต์ ํ: ์ต์ ํ๋ IR์ ๋ํด ํ ๋ฒ๋ง ์์ฑํ๋ฉด ์ฌ๋ฌ ์์ค ์ธ์ด์ ์ ์ฉ๋ ์ ์์ต๋๋ค. ์ด๋ ์ฌ๋ฌ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ง์ํ ๋ ํ์ํ ์ค๋ณต ์์ ์ ์ค์ฌ์ค๋๋ค.
์ค๊ฐ ํํ์ ์ข ๋ฅ
IR์ ๋ค์ํ ํํ๋ก ์ ๊ณต๋๋ฉฐ, ๊ฐ๊ธฐ ๋ค๋ฅธ ๊ฐ์ ๊ณผ ์ฝ์ ์ ๊ฐ์ง๊ณ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ์ ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
1. ์ถ์ ๊ตฌ๋ฌธ ํธ๋ฆฌ(AST)
AST๋ ์์ค ์ฝ๋์ ๊ตฌ์กฐ๋ฅผ ํธ๋ฆฌ ํํ๋ก ํํํ ๊ฒ์ ๋๋ค. ์ด๋ ํํ์, ๋ฌธ์ฅ, ์ ์ธ๊ณผ ๊ฐ์ ์ฝ๋์ ์ฌ๋ฌ ๋ถ๋ถ ๊ฐ์ ๋ฌธ๋ฒ์ ๊ด๊ณ๋ฅผ ํฌ์ฐฉํฉ๋๋ค.
์์: `x = y + 2 * z`๋ผ๋ ํํ์์ ์๊ฐํด ๋ด ์๋ค. ์ด ํํ์์ ๋ํ AST๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
=
/ \
x +
/ \
y *
/ \
2 z
AST๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ฏธ ๋ถ์ ๋ฐ ํ์ ๊ฒ์ฌ์ ๊ฐ์ ์ปดํ์ผ ์ด๊ธฐ ๋จ๊ณ์์ ์ฌ์ฉ๋ฉ๋๋ค. ์์ค ์ฝ๋์ ๋น๊ต์ ๊ฐ๊น์ฐ๋ฉฐ ์๋ ๊ตฌ์กฐ๋ฅผ ๋ง์ด ์ ์งํ๊ณ ์์ด ๋๋ฒ๊น ๋ฐ ์์ค ์์ค ๋ณํ์ ์ ์ฉํฉ๋๋ค.
2. 3์ฃผ์ ์ฝ๋(TAC)
TAC๋ ๊ฐ ๋ช ๋ น์ด๊ฐ ์ต๋ ์ธ ๊ฐ์ ํผ์ฐ์ฐ์๋ฅผ ๊ฐ๋ ์ ํ์ ์ธ ๋ช ๋ น์ด ์ํ์ค์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก `x = y op z` ํํ๋ฅผ ์ทจํ๋ฉฐ, ์ฌ๊ธฐ์ `x`, `y`, `z`๋ ๋ณ์ ๋๋ ์์์ด๊ณ `op`๋ ์ฐ์ฐ์์ ๋๋ค. TAC๋ ๋ณต์กํ ์ฐ์ฐ์ ํํ์ ์ผ๋ จ์ ๋ ๊ฐ๋จํ ๋จ๊ณ๋ก ๋จ์ํํฉ๋๋ค.
์์: ๋ค์ `x = y + 2 * z` ํํ์์ ์๊ฐํด ๋ด ์๋ค. ํด๋นํ๋ TAC๋ ๋ค์๊ณผ ๊ฐ์ ์ ์์ต๋๋ค:
t1 = 2 * z
t2 = y + t1
x = t2
์ฌ๊ธฐ์ `t1`๊ณผ `t2`๋ ์ปดํ์ผ๋ฌ์ ์ํด ๋์ ๋ ์์ ๋ณ์์ ๋๋ค. TAC๋ ๊ทธ ๊ฐ๋จํ ๊ตฌ์กฐ ๋๋ถ์ ์ฝ๋๋ฅผ ๋ถ์ํ๊ณ ๋ณํํ๊ธฐ ์ฌ์ ์ต์ ํ ํจ์ค์ ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค. ๋ํ ๊ธฐ๊ณ ์ฝ๋๋ฅผ ์์ฑํ๋ ๋ฐ์๋ ์ ํฉํฉ๋๋ค.
3. ์ ์ ๋จ์ผ ํ ๋น(SSA) ํํ
SSA๋ ๊ฐ ๋ณ์์ ๊ฐ์ด ํ ๋ฒ๋ง ํ ๋น๋๋ TAC์ ๋ณํ์ ๋๋ค. ๋ณ์์ ์๋ก์ด ๊ฐ์ ํ ๋นํด์ผ ํ๋ ๊ฒฝ์ฐ, ๋ณ์์ ์ ๋ฒ์ ์ด ์์ฑ๋ฉ๋๋ค. SSA๋ ๋์ผํ ๋ณ์์ ๋ํ ์ฌ๋ฌ ํ ๋น์ ์ถ์ ํ ํ์๋ฅผ ์์ ๋ฏ๋ก ๋ฐ์ดํฐ ํ๋ฆ ๋ถ์๊ณผ ์ต์ ํ๋ฅผ ํจ์ฌ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
์์: ๋ค์ ์ฝ๋ ์กฐ๊ฐ์ ์๊ฐํด ๋ด ์๋ค:
x = 10
y = x + 5
x = 20
z = x + y
์ด์ ์์ํ๋ SSA ํํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
x1 = 10
y1 = x1 + 5
x2 = 20
z1 = x2 + y1
๊ฐ ๋ณ์๊ฐ ํ ๋ฒ๋ง ํ ๋น๋๋ ๊ฒ์ ์ฃผ๋ชฉํ์ธ์. `x`๊ฐ ์ฌํ ๋น๋ ๋ ์๋ก์ด ๋ฒ์ ์ธ `x2`๊ฐ ์์ฑ๋ฉ๋๋ค. SSA๋ ์์ ์ ํ ๋ฐ ์ฃฝ์ ์ฝ๋ ์ ๊ฑฐ์ ๊ฐ์ ๋ง์ ์ต์ ํ ์๊ณ ๋ฆฌ์ฆ์ ๋จ์ํํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก `x3 = phi(x1, x2)`๋ก ์์ฑ๋๋ Phi ํจ์๋ ์ ์ด ํ๋ฆ์ด ํฉ์ณ์ง๋ ์ง์ ์๋ ์ข ์ข ์กด์ฌํฉ๋๋ค. ์ด๋ phi ํจ์์ ๋๋ฌํ๊ธฐ ์ํด ์ด๋ค ๊ฒฝ๋ก๋ฅผ ํํ๋์ง์ ๋ฐ๋ผ `x3`๊ฐ `x1` ๋๋ `x2`์ ๊ฐ์ ๊ฐ๊ฒ ๋จ์ ๋ํ๋ ๋๋ค.
4. ์ ์ด ํ๋ฆ ๊ทธ๋ํ(CFG)
CFG๋ ํ๋ก๊ทธ๋จ ๋ด์ ์คํ ํ๋ฆ์ ๋ํ๋ ๋๋ค. ์ด๊ฒ์ ๋ ธ๋๊ฐ ๊ธฐ๋ณธ ๋ธ๋ก(๋จ์ผ ์ง์ ์ ๊ณผ ์ง์ถ์ ์ ๊ฐ์ง ๋ช ๋ น์ด ์ํ์ค)์ ๋ํ๋ด๊ณ , ์ฃ์ง๊ฐ ๊ทธ๋ค ์ฌ์ด์ ๊ฐ๋ฅํ ์ ์ด ํ๋ฆ ์ ํ์ ๋ํ๋ด๋ ๋ฐฉํฅ์ฑ ๊ทธ๋ํ์ ๋๋ค.
CFG๋ ํ์ฑ ๋ถ์, ๋๋ฌ ์ ์, ๋ฃจํ ํ์ง๋ฅผ ํฌํจํ ๋ค์ํ ๋ถ์์ ํ์์ ์ ๋๋ค. ์ด๋ ์ปดํ์ผ๋ฌ๊ฐ ๋ช ๋ น์ด๊ฐ ์คํ๋๋ ์์์ ๋ฐ์ดํฐ๊ฐ ํ๋ก๊ทธ๋จ์ ํตํด ํ๋ฅด๋ ๋ฐฉ์์ ์ดํดํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
5. ๋ฐฉํฅ์ฑ ๋น์ํ ๊ทธ๋ํ(DAG)
CFG์ ์ ์ฌํ์ง๋ง ๊ธฐ๋ณธ ๋ธ๋ก ๋ด์ ํํ์์ ์ด์ ์ ๋ง์ถฅ๋๋ค. DAG๋ ์ฐ์ฐ ๊ฐ์ ์ข ์์ฑ์ ์๊ฐ์ ์ผ๋ก ๋ํ๋ด์ด, ๊ณตํต ๋ถ๋ถ ํํ์ ์ ๊ฑฐ ๋ฐ ๋จ์ผ ๊ธฐ๋ณธ ๋ธ๋ก ๋ด์ ๋ค๋ฅธ ๋ณํ์ ์ต์ ํํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
6. ํ๋ซํผ ํน์ IR (์: LLVM IR, JVM ๋ฐ์ดํธ์ฝ๋)
์ผ๋ถ ์์คํ ์ ํ๋ซํผ ํน์ IR์ ํ์ฉํฉ๋๋ค. ๋ ๊ฐ์ง ์ฃผ์ ์๋ LLVM IR๊ณผ JVM ๋ฐ์ดํธ์ฝ๋์ ๋๋ค.
LLVM IR
LLVM(Low Level Virtual Machine)์ ๊ฐ๋ ฅํ๊ณ ์ ์ฐํ IR์ ์ ๊ณตํ๋ ์ปดํ์ผ๋ฌ ์ธํ๋ผ ํ๋ก์ ํธ์ ๋๋ค. LLVM IR์ ๊ฐ๋ ฅํ ํ์ ์ ์ง์ํ๋ ์ ์์ค ์ธ์ด๋ก, ๊ด๋ฒ์ํ ๋์ ์ํคํ ์ฒ๋ฅผ ์ง์ํฉ๋๋ค. Clang(C, C++, Objective-C์ฉ), Swift, Rust๋ฅผ ํฌํจํ ๋ง์ ์ปดํ์ผ๋ฌ์์ ์ฌ์ฉ๋ฉ๋๋ค.
LLVM IR์ ์ฝ๊ฒ ์ต์ ํ๋๊ณ ๊ธฐ๊ณ ์ฝ๋๋ก ๋ณํ๋๋๋ก ์ค๊ณ๋์์ต๋๋ค. SSA ํํ, ๋ค์ํ ๋ฐ์ดํฐ ํ์ ์ง์, ํ๋ถํ ๋ช ๋ น์ด ์ธํธ์ ๊ฐ์ ๊ธฐ๋ฅ๋ค์ ํฌํจํฉ๋๋ค. LLVM ์ธํ๋ผ๋ LLVM IR๋ก๋ถํฐ ์ฝ๋๋ฅผ ๋ถ์, ๋ณํ, ์์ฑํ๊ธฐ ์ํ ๋๊ตฌ ๋ชจ์์ ์ ๊ณตํฉ๋๋ค.
JVM ๋ฐ์ดํธ์ฝ๋
JVM(Java Virtual Machine) ๋ฐ์ดํธ์ฝ๋๋ ์๋ฐ ๊ฐ์ ๋จธ์ ์์ ์ฌ์ฉ๋๋ IR์ ๋๋ค. ์ด๊ฒ์ JVM์ ์ํด ์คํ๋๋ ์คํ ๊ธฐ๋ฐ ์ธ์ด์ ๋๋ค. Java ์ปดํ์ผ๋ฌ๋ Java ์์ค ์ฝ๋๋ฅผ JVM ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ๋ฉฐ, ์ด๋ JVM์ด ๊ตฌํ๋ ๋ชจ๋ ํ๋ซํผ์์ ์คํ๋ ์ ์์ต๋๋ค.
JVM ๋ฐ์ดํธ์ฝ๋๋ ํ๋ซํผ์ ๋ ๋ฆฝ์ ์ด๊ณ ์์ ํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ฐ ๋์ ํด๋์ค ๋ก๋ฉ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ํฌํจํฉ๋๋ค. JVM์ ๋ฐ์ดํธ์ฝ๋๋ฅผ ์คํํ๊ณ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ฐํ์ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
์ต์ ํ์์ IR์ ์ญํ
IR์ ์ฝ๋ ์ต์ ํ์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. ํ๋ก๊ทธ๋จ์ ๋จ์ํ๋๊ณ ํ์คํ๋ ํํ๋ก ํํํจ์ผ๋ก์จ, IR์ ์ปดํ์ผ๋ฌ๊ฐ ์์ฑ๋ ์ฝ๋์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ค์ํ ๋ณํ์ ์ํํ ์ ์๊ฒ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ์ต์ ํ ๊ธฐ์ ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค:
- ์์ ํด๋ฉ: ์ปดํ์ผ ์๊ฐ์ ์์ ํํ์์ ํ๊ฐํฉ๋๋ค.
- ์ฃฝ์ ์ฝ๋ ์ ๊ฑฐ: ํ๋ก๊ทธ๋จ์ ์ถ๋ ฅ์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ์ฝ๋๋ฅผ ์ ๊ฑฐํฉ๋๋ค.
- ๊ณตํต ๋ถ๋ถ ํํ์ ์ ๊ฑฐ: ๋์ผํ ํํ์์ ์ฌ๋ฌ ๋ฐ์์ ๋จ์ผ ๊ณ์ฐ์ผ๋ก ๋์ฒดํฉ๋๋ค.
- ๋ฃจํ ํผ์น๊ธฐ: ๋ฃจํ ์ ์ด์ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ธฐ ์ํด ๋ฃจํ๋ฅผ ํ์ฅํฉ๋๋ค.
- ์ธ๋ผ์ด๋: ํจ์ ํธ์ถ ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ธฐ ์ํด ํจ์ ํธ์ถ์ ํจ์ ๋ณธ๋ฌธ์ผ๋ก ๋์ฒดํฉ๋๋ค.
- ๋ ์ง์คํฐ ํ ๋น: ์ ๊ทผ ์๋๋ฅผ ํฅ์์ํค๊ธฐ ์ํด ๋ณ์๋ฅผ ๋ ์ง์คํฐ์ ํ ๋นํฉ๋๋ค.
- ๋ช ๋ น์ด ์ค์ผ์ค๋ง: ํ์ดํ๋ผ์ธ ํ์ฉ๋๋ฅผ ๋์ด๊ธฐ ์ํด ๋ช ๋ น์ด ์์๋ฅผ ์ฌ์ ๋ ฌํฉ๋๋ค.
์ด๋ฌํ ์ต์ ํ๋ IR์ ๋ํด ์ํ๋๋ฏ๋ก ์ปดํ์ผ๋ฌ๊ฐ ์ง์ํ๋ ๋ชจ๋ ๋์ ์ํคํ ์ฒ์ ์ด์ ์ ์ค ์ ์์ต๋๋ค. ์ด๊ฒ์ด IR ์ฌ์ฉ์ ํต์ฌ ์ฅ์ ์ด๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ์ต์ ํ ํจ์ค๋ฅผ ํ ๋ฒ ์์ฑํ์ฌ ๊ด๋ฒ์ํ ํ๋ซํผ์ ์ ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค. ์๋ฅผ ๋ค์ด, LLVM ์ตํฐ๋ง์ด์ ๋ LLVM IR์์ ์์ฑ๋ ์ฝ๋์ ์ฑ๋ฅ์ ํฅ์์ํค๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋๊ท๋ชจ ์ต์ ํ ํจ์ค ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฅผ ํตํด LLVM ์ตํฐ๋ง์ด์ ์ ๊ธฐ์ฌํ๋ ๊ฐ๋ฐ์๋ค์ C++, Swift, Rust๋ฅผ ํฌํจํ ๋ง์ ์ธ์ด์ ์ฑ๋ฅ์ ์ ์ฌ์ ์ผ๋ก ํฅ์์ํฌ ์ ์์ต๋๋ค.
ํจ๊ณผ์ ์ธ ์ค๊ฐ ํํ ๋ง๋ค๊ธฐ
์ข์ IR์ ์ค๊ณํ๋ ๊ฒ์ ์ฌ์ธํ ๊ท ํ ์ก๊ธฐ์ ๋๋ค. ๊ณ ๋ คํด์ผ ํ ๋ช ๊ฐ์ง ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ถ์ํ ์์ค: ์ข์ IR์ ํ๋ซํผ ํน์ ์ธ๋ถ ์ฌํญ์ ์จ๊ธธ ๋งํผ ์ถฉ๋ถํ ์ถ์์ ์ด๋ฉด์๋ ํจ๊ณผ์ ์ธ ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ ๋งํผ ๊ตฌ์ฒด์ ์ด์ด์ผ ํฉ๋๋ค. ๋งค์ฐ ๋์ ์์ค์ IR์ ์์ค ์ธ์ด์ ์ ๋ณด๋ฅผ ๋๋ฌด ๋ง์ด ์ ์งํ์ฌ ์ ์์ค ์ต์ ํ๋ฅผ ์ํํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๋งค์ฐ ๋ฎ์ ์์ค์ IR์ ๋์ ์ํคํ ์ฒ์ ๋๋ฌด ๊ฐ๊น์์ ์ฌ๋ฌ ํ๋ซํผ์ ๋์์ผ๋ก ํ๊ธฐ ์ด๋ ต๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- ๋ถ์์ ์ฉ์ด์ฑ: IR์ ์ ์ ๋ถ์์ ์ฉ์ดํ๊ฒ ํ๋๋ก ์ค๊ณ๋์ด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ฐ์ดํฐ ํ๋ฆ ๋ถ์์ ๋จ์ํํ๋ SSA ํํ์ ๊ฐ์ ๊ธฐ๋ฅ์ด ํฌํจ๋ฉ๋๋ค. ์ฝ๊ฒ ๋ถ์ํ ์ ์๋ IR์ ๋ ์ ํํ๊ณ ํจ๊ณผ์ ์ธ ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
- ๋์ ์ํคํ ์ฒ ๋ ๋ฆฝ์ฑ: IR์ ํน์ ๋์ ์ํคํ ์ฒ์ ๋ ๋ฆฝ์ ์ด์ด์ผ ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ปดํ์ผ๋ฌ๋ ์ต์ ํ ํจ์ค์ ์ต์ํ์ ๋ณ๊ฒฝ๋ง์ผ๋ก ์ฌ๋ฌ ํ๋ซํผ์ ๋์์ผ๋ก ํ ์ ์์ต๋๋ค.
- ์ฝ๋ ํฌ๊ธฐ: IR์ ์ ์ฅํ๊ณ ์ฒ๋ฆฌํ๊ธฐ์ ๊ฐ๊ฒฐํ๊ณ ํจ์จ์ ์ด์ด์ผ ํฉ๋๋ค. ํฌ๊ณ ๋ณต์กํ IR์ ์ปดํ์ผ ์๊ฐ๊ณผ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ฆ๊ฐ์ํฌ ์ ์์ต๋๋ค.
์ค์ธ๊ณ IR์ ์
์ผ๋ถ ์ธ๊ธฐ ์๋ ์ธ์ด์ ์์คํ ์์ IR์ด ์ด๋ป๊ฒ ์ฌ์ฉ๋๋์ง ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- Java: ์์ ์ธ๊ธํ๋ฏ์ด, Java๋ JVM ๋ฐ์ดํธ์ฝ๋๋ฅผ IR๋ก ์ฌ์ฉํฉ๋๋ค. Java ์ปดํ์ผ๋ฌ(`javac`)๋ Java ์์ค ์ฝ๋๋ฅผ ๋ฐ์ดํธ์ฝ๋๋ก ๋ณํํ๊ณ , ์ด๋ JVM์ ์ํด ์คํ๋ฉ๋๋ค. ์ด๋ฅผ ํตํด Java ํ๋ก๊ทธ๋จ์ ํ๋ซํผ์ ๋ ๋ฆฝ์ ์ด ๋ฉ๋๋ค.
- .NET: .NET ํ๋ ์์ํฌ๋ ๊ณตํต ์ค๊ฐ ์ธ์ด(CIL)๋ฅผ IR๋ก ์ฌ์ฉํฉ๋๋ค. CIL์ JVM ๋ฐ์ดํธ์ฝ๋์ ์ ์ฌํ๋ฉฐ ๊ณตํต ์ธ์ด ๋ฐํ์(CLR)์ ์ํด ์คํ๋ฉ๋๋ค. C# ๋ฐ VB.NET๊ณผ ๊ฐ์ ์ธ์ด๋ CIL๋ก ์ปดํ์ผ๋ฉ๋๋ค.
- Swift: Swift๋ LLVM IR์ IR๋ก ์ฌ์ฉํฉ๋๋ค. Swift ์ปดํ์ผ๋ฌ๋ Swift ์์ค ์ฝ๋๋ฅผ LLVM IR๋ก ๋ณํํ๊ณ , ์ด๋ LLVM ๋ฐฑ์๋์ ์ํด ์ต์ ํ๋๊ณ ๊ธฐ๊ณ ์ฝ๋๋ก ์ปดํ์ผ๋ฉ๋๋ค.
- Rust: Rust ๋ํ LLVM IR์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด Rust๋ LLVM์ ๊ฐ๋ ฅํ ์ต์ ํ ๊ธฐ๋ฅ์ ํ์ฉํ๊ณ ๊ด๋ฒ์ํ ํ๋ซํผ์ ๋์์ผ๋ก ํ ์ ์์ต๋๋ค.
- Python (CPython): CPython์ ์์ค ์ฝ๋๋ฅผ ์ง์ ํด์ํ์ง๋ง, Numba์ ๊ฐ์ ๋๊ตฌ๋ LLVM์ ์ฌ์ฉํ์ฌ Python ์ฝ๋์์ ์ต์ ํ๋ ๊ธฐ๊ณ ์ฝ๋๋ฅผ ์์ฑํ๋ฉฐ, ์ด ๊ณผ์ ์ ์ผ๋ถ๋ก LLVM IR์ ์ฌ์ฉํฉ๋๋ค. PyPy์ ๊ฐ์ ๋ค๋ฅธ ๊ตฌํ์ JIT ์ปดํ์ผ ๊ณผ์ ์์ ๋ค๋ฅธ IR์ ์ฌ์ฉํฉ๋๋ค.
IR๊ณผ ๊ฐ์ ๋จธ์
IR์ ๊ฐ์ ๋จธ์ (VM)์ ์๋์ ๊ธฐ๋ณธ์ด ๋ฉ๋๋ค. VM์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์ดํฐ๋ธ ๊ธฐ๊ณ ์ฝ๋ ๋์ JVM ๋ฐ์ดํธ์ฝ๋๋ CIL๊ณผ ๊ฐ์ IR์ ์คํํฉ๋๋ค. ์ด๋ฅผ ํตํด VM์ ํ๋ซํผ์ ๋ ๋ฆฝ์ ์ธ ์คํ ํ๊ฒฝ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ๋ํ VM์ ๋ฐํ์์ IR์ ๋ํ ๋์ ์ต์ ํ๋ฅผ ์ํํ์ฌ ์ฑ๋ฅ์ ๋์ฑ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์ด ๊ณผ์ ์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์์ ํฌํจํฉ๋๋ค:
- ์์ค ์ฝ๋๋ฅผ IR๋ก ์ปดํ์ผ.
- VM์ผ๋ก IR ๋ก๋ฉ.
- IR์ ๋ค์ดํฐ๋ธ ๊ธฐ๊ณ ์ฝ๋๋ก ํด์ ๋๋ JIT(Just-In-Time) ์ปดํ์ผ.
- ๋ค์ดํฐ๋ธ ๊ธฐ๊ณ ์ฝ๋ ์คํ.
JIT ์ปดํ์ผ์ VM์ด ๋ฐํ์ ๋์์ ๊ธฐ๋ฐ์ผ๋ก ์ฝ๋๋ฅผ ๋์ ์ผ๋ก ์ต์ ํํ ์ ์๊ฒ ํ์ฌ, ์ ์ ์ปดํ์ผ๋ง์ผ๋ก๋ ์ป์ ์ ์๋ ๋ ๋์ ์ฑ๋ฅ์ ์ด๋์ด๋ ๋๋ค.
์ค๊ฐ ํํ์ ๋ฏธ๋
IR ๋ถ์ผ๋ ์๋ก์ด ํํ ๋ฐฉ์๊ณผ ์ต์ ํ ๊ธฐ์ ์ ๋ํ ์ง์์ ์ธ ์ฐ๊ตฌ์ ํจ๊ป ๊ณ์ํด์ ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ํ์ฌ์ ๋ช ๊ฐ์ง ์ถ์ธ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ทธ๋ํ ๊ธฐ๋ฐ IR: ํ๋ก๊ทธ๋จ์ ์ ์ด ๋ฐ ๋ฐ์ดํฐ ํ๋ฆ์ ๋ ๋ช ์์ ์ผ๋ก ๋ํ๋ด๊ธฐ ์ํด ๊ทธ๋ํ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ํ๋ก์์ ๊ฐ ๋ถ์ ๋ฐ ์ ์ญ ์ฝ๋ ์ด๋๊ณผ ๊ฐ์ ๋ ์ ๊ตํ ์ต์ ํ ๊ธฐ์ ์ ๊ฐ๋ฅํ๊ฒ ํ ์ ์์ต๋๋ค.
- ๋ค๋ณ์ฒด ์ปดํ์ผ: ๋ฃจํ์ ๋ฐฐ์ด ์ ๊ทผ์ ๋ถ์ํ๊ณ ๋ณํํ๊ธฐ ์ํด ์ํ์ ๊ธฐ๋ฒ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ ๊ณผํ ๋ฐ ๊ณตํ ์์ฉ ํ๋ก๊ทธ๋จ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋๋ฉ์ธ ํน์ IR: ๋จธ์ ๋ฌ๋์ด๋ ์ด๋ฏธ์ง ์ฒ๋ฆฌ์ ๊ฐ์ ํน์ ๋๋ฉ์ธ์ ๋ง์ถฐ์ง IR์ ์ค๊ณํฉ๋๋ค. ์ด๋ ํด๋น ๋๋ฉ์ธ์ ํนํ๋ ๋ ๊ณต๊ฒฉ์ ์ธ ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ ์ ์์ต๋๋ค.
- ํ๋์จ์ด ์ธ์ IR: ๊ธฐ๋ณธ ํ๋์จ์ด ์ํคํ ์ฒ๋ฅผ ๋ช ์์ ์ผ๋ก ๋ชจ๋ธ๋งํ๋ IR์ ๋๋ค. ์ด๋ฅผ ํตํด ์ปดํ์ผ๋ฌ๋ ์บ์ ํฌ๊ธฐ, ๋ฉ๋ชจ๋ฆฌ ๋์ญํญ, ๋ช ๋ น์ด ์์ค ๋ณ๋ ฌ์ฑ๊ณผ ๊ฐ์ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ๋์ ํ๋ซํผ์ ๋ ์ ์ต์ ํ๋ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค.
๋์ ๊ณผ์ ๋ฐ ๊ณ ๋ ค ์ฌํญ
์ด๋ฌํ ์ด์ ์๋ ๋ถ๊ตฌํ๊ณ , IR์ ๋ค๋ฃจ๋ ๋ฐ์๋ ๋ช ๊ฐ์ง ์ด๋ ค์์ด ๋ฐ๋ฆ ๋๋ค:
- ๋ณต์ก์ฑ: IR๊ณผ ๊ทธ์ ๊ด๋ จ๋ ๋ถ์ ๋ฐ ์ต์ ํ ํจ์ค๋ฅผ ์ค๊ณํ๊ณ ๊ตฌํํ๋ ๊ฒ์ ๋ณต์กํ๊ณ ์๊ฐ์ด ๋ง์ด ์์๋ ์ ์์ต๋๋ค.
- ๋๋ฒ๊น : IR ์์ค์์ ์ฝ๋๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์๋ํ๋ฉด IR์ด ์์ค ์ฝ๋์ ์๋นํ ๋ค๋ฅผ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. IR ์ฝ๋๋ฅผ ์๋ ์์ค ์ฝ๋๋ก ๋ค์ ๋งคํํ๊ธฐ ์ํ ๋๊ตฌ์ ๊ธฐ์ ์ด ํ์ํฉ๋๋ค.
- ์ฑ๋ฅ ์ค๋ฒํค๋: ์ฝ๋๋ฅผ IR๋ก ๋ณํํ๊ณ ๋ค์ ๋ณํํ๋ ๊ณผ์ ์์ ์ฝ๊ฐ์ ์ฑ๋ฅ ์ค๋ฒํค๋๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค. IR์ ์ฌ์ฉํ๋ ๊ฒ์ด ๊ฐ์น๊ฐ ์์ผ๋ ค๋ฉด ์ต์ ํ์ ์ด์ ์ด ์ด ์ค๋ฒํค๋๋ฅผ ๋ฅ๊ฐํด์ผ ํฉ๋๋ค.
- IR์ ์งํ: ์๋ก์ด ์ํคํ ์ฒ์ ํ๋ก๊ทธ๋๋ฐ ํจ๋ฌ๋ค์์ด ๋ฑ์ฅํจ์ ๋ฐ๋ผ, IR์ ์ด๋ฅผ ์ง์ํ๊ธฐ ์ํด ์งํํด์ผ ํฉ๋๋ค. ์ด๋ฅผ ์ํด์๋ ์ง์์ ์ธ ์ฐ๊ตฌ์ ๊ฐ๋ฐ์ด ํ์ํฉ๋๋ค.
๊ฒฐ๋ก
์ค๊ฐ ํํ์ ํ๋ ์ปดํ์ผ๋ฌ ์ค๊ณ์ ๊ฐ์ ๋จธ์ ๊ธฐ์ ์ ์ด์์ ๋๋ค. ์ด๋ ์ฝ๋ ์ด์์ฑ, ์ต์ ํ, ๋ชจ๋์ฑ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ค์ํ ์ถ์ํ๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ค์ํ ์ข ๋ฅ์ IR๊ณผ ์ปดํ์ผ ๊ณผ์ ์์์ ์ญํ ์ ์ดํดํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ๋ณต์ก์ฑ๊ณผ ํจ์จ์ ์ด๊ณ ์ ๋ขฐํ ์ ์๋ ์ฝ๋๋ฅผ ๋ง๋๋ ์ด๋ ค์์ ๋ํด ๋ ๊น์ด ์ดํดํ ์ ์์ต๋๋ค.
๊ธฐ์ ์ด ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ, IR์ ๊ณ ๊ธ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์ ๋์์์ด ์งํํ๋ ํ๋์จ์ด ์ํคํ ์ฒ ํ๊ฒฝ ์ฌ์ด์ ๊ฒฉ์ฐจ๋ฅผ ํด์ํ๋ ๋ฐ ์์ฌํ ์ฌ์ง์์ด ์ ์ ๋ ์ค์ํ ์ญํ ์ ํ ๊ฒ์ ๋๋ค. ํ๋์จ์ด ํน์ ์ธ๋ถ ์ฌํญ์ ์ถ์ํํ๋ฉด์๋ ๊ฐ๋ ฅํ ์ต์ ํ๋ฅผ ํ์ฉํ๋ ๋ฅ๋ ฅ์ ์ํํธ์จ์ด ๊ฐ๋ฐ์ ์์ด์๋ ์ ๋ ๋๊ตฌ๋ก ๋ง๋ญ๋๋ค.